package io.renren.utils;


import io.renren.entity.Dictionary;
import org.apache.commons.lang.StringUtils;

import java.util.ArrayList;
import java.util.List;

public class VoiceSearchUtil {

	/**
	 * 解析字符串
	 *
	 * @param voiceStr
	 * @return
	 */
	public static String[] SubjectAndPageNoParse(String voiceStr, List<Dictionary> subjectList) {
		String[] seg = new String[3];
		// 学科
		seg[0] = "";
		for (Dictionary subject : subjectList) {
			if (voiceStr.indexOf(subject.getName()) >= 0) {
				seg[0] = subject.getId()+"";
				seg[2] = subject.getName();
				break;
			}
		}

		// 页码
		seg[1] = "";
		voiceStr = voiceStr.replaceAll("液", ConfigConstant.PAGE_END);
		voiceStr = voiceStr.replaceAll("夜", ConfigConstant.PAGE_END);
		voiceStr = voiceStr.trim();

		// 获取到第一次出现的连续数字，作为页码
		String temp = "";
		boolean find = false;
		for (int i = 0; i < voiceStr.length(); i++) {
			if (voiceStr.charAt(i) >= 48 && voiceStr.charAt(i) <= 57) {
				find = true;
				temp += voiceStr.charAt(i);
			} else {
				if (find) {
					break;
				}
			}
		}

		if (StringUtils.isNotBlank(temp)) {
			seg[1] = temp;
			return seg;
		}

		if (voiceStr.indexOf(ConfigConstant.PAGE_END) >= 0) {
			String tempStr = new String(voiceStr);
			tempStr = tempStr.replaceAll(seg[0], "");

			// 把页字后面的字符串去掉
			tempStr = tempStr.substring(0, tempStr.indexOf(ConfigConstant.PAGE_END) + 1);

			int start = tempStr.indexOf(ConfigConstant.PAGE_START) + ConfigConstant.PAGE_START.length();
			int end = tempStr.indexOf(ConfigConstant.PAGE_END);
			tempStr = tempStr.substring(start, end);

			if (isNumeric(tempStr)) {
				seg[1] = tempStr;
			} else {
				int number = convertWordToNumber(tempStr);
				if (number > 0) {
					seg[1] = Integer.toString(number);
				}
			}
		}
		return seg;
	}

	/**
	 * 文本转换成数字
	 *
	 * @param wText
	 * @return
	 */
	public static int convertWordToNumber(String wText) {
		// 先替换一下可能的错字
		wText = wText.replace("把", "百");
		wText = wText.replace("白", "百");
		wText = wText.replace("佰", "百");
		//
		int result = 0;
		int p = 0;// 用于记录遍历到字符的位置和保存到 list<int>的个数
		String numString = "一二三四五六七八九壹贰参肆伍陆柒捌玖两俩仨";
		int isNumeric = -1;
		ArrayList<Integer> numList = new ArrayList<Integer>(5);
		char[] chars = wText.toCharArray();
		//
		// 逐个字符遍历
		// 遇到数字，就保存至 list<int>，遇到“十百”就进行分析，并正确组合之前list<int>的数字
		try {
			for (int i = 0; i < chars.length; i++) {
				isNumeric = numString.indexOf(chars[i]);
				if (isNumeric > -1) {
					// 如果是数字，list<int> 中添加入一位数字，并将 p 作为指针移动一位
					numList.add(ConfigConstant.wtonDict.get(String.valueOf(chars[i])));
					p++;
				} else {
					switch (chars[i]) {

						case '十':
							if (i == 0) // i=0说明十在第一个，是 1x 这样的数字
							{
								numList.add(10);
								p++;
							} else // 如果不是，前面的一个数字要乘以10
							{
								if (chars[i - 1] == '零' || chars[i - 1] == '第')// 如果十字的前面是零，按默认一十处理，否则，按常规处理
								{
									numList.add(10);
									p++;
								} else {
									// numList[p - 1] = numList[p - 1] * 10;
									numList.set(p - 1, numList.get(p - 1) * 10);
								}
							}
							break;
						case '百':
							// numList[p - 1] = numList[p - 1] * 100;
							numList.set(p - 1, numList.get(p - 1) * 100);
							break;
						case '零':
							// 零不需要处理
							break;
					}
				}
			}
			// 循环处理结束后，将 list<int> 中的所有数字相加就是结果
			for (int k : numList) {
				result += k;
			}
			//
			return result;
		} catch (Exception ex) {
			return -1;
		}
	}

	/**
	 * 判断是否为数字
	 *
	 * @param str
	 * @return
	 */
	public static boolean isNumeric(String str) {
		for (int i = 0; i < str.length(); i++) {
			if (!Character.isDigit(str.charAt(i))) {
				return false;
			}
		}
		return true;
	}

}
